package dao

import (
	"context"
	"fmt"
	"github.com/go-redis/redis/v8"
	"shopAdd-srv/global"
	"shopAdd-srv/internal/model"
	"strconv"
)

type TopServiceImpl interface {
	Top() ([]map[string]interface{}, error)
}
type TopService struct {
}

func NewTopService() *TopService {
	return &TopService{}
}
func (t *TopService) Top() ([]map[string]interface{}, error) {
	var shop model.Shop

	// 1. 查询商品列表（返回类型：[]*__.TopList）
	list := shop.ShopList(global.DB)

	// 2. 同步到Redis有序集合（用TopList的字段构建ZSet）
	topRedis := make([]*redis.Z, 0, len(list))
	for _, m := range list {
		topRedis = append(topRedis, &redis.Z{
			Score:  float64(m.Price),                // 用TopList的Price作为分数
			Member: strconv.FormatInt(m.UserId, 10), // 用TopList的Id作为Member（确保是商品唯一ID）
		})
	}
	rankKey := "rank:shop:price"
	_, err := global.Rdb.ZAdd(context.Background(), rankKey, topRedis...).Result()
	if err != nil {
		return nil, fmt.Errorf("同步到Redis失败: %v", err)
	}

	// 3. 查询Redis排行结果
	result, _ := global.Rdb.ZRevRangeWithScores(context.Background(), rankKey, 0, 4).Result()

	// 4. 关键修正：将 *__.TopList 转换为 *model.Shop 并存入map
	productMap := make(map[int64]*model.Shop)
	for _, m := range list {
		// 手动映射字段（将TopList的字段赋值给model.Shop）
		productMap[m.UserId] = &model.Shop{
			// 假设TopList的Id对应model.Shop的ID
			Name:   m.Name,           // 假设字段名一致
			Price:  float64(m.Price), // 假设字段名一致
			UserId: int(m.UserId),    // 假设字段名一致
			// 其他字段按实际情况映射...
		}
	}

	// 5. 组装排行结果
	topList := make([]map[string]interface{}, 0, len(result))
	for i, z := range result {
		productID, err := strconv.ParseInt(z.Member.(string), 10, 64)
		if err != nil {
			return nil, fmt.Errorf("解析商品ID失败: %v", err)
		}

		product := productMap[productID]
		if product == nil {
			return nil, fmt.Errorf("商品ID %d 不存在", productID)
		}

		topList = append(topList, map[string]interface{}{
			"rank":  i + 1,
			"score": z.Score,
			"product": map[string]interface{}{
				"id":     product.ID,
				"name":   product.Name,
				"price":  product.Price,
				"userId": product.UserId,
			},
		})
	}

	return topList, nil
}
